home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
game
/
role
/
Ang261Lib.lha
/
src
/
magic.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-22
|
10KB
|
365 lines
/*
* magic.c: code for mage spells
*
* Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
*
* This software may be copied and distributed for educational, research, and
* not for profit purposes provided that this copyright and statement are
* included in all such copies.
*/
#include "constant.h"
#include "config.h"
#include "types.h"
#include "externs.h"
/* Lets do all prototypes correctly.... -CWS */
#ifndef NO_LINT_ARGS
int door_creation();
int detect_magic();
int stair_creation();
#endif
/* Throw a magic spell -RAK- */
void
cast()
{
int i, j, item_val, dir;
int choice, chance, result;
register struct flags *f_ptr;
register struct misc *p_ptr;
register spell_type *m_ptr;
free_turn_flag = TRUE;
if (py.flags.blind > 0)
msg_print("You can't see to read your spell book!");
else if (no_light())
msg_print("You have no light to read by.");
else if (py.flags.confused > 0)
msg_print("You are too confused.");
else if (class[py.misc.pclass].spell != MAGE)
msg_print("You can't cast spells!");
else if (!find_range(TV_MAGIC_BOOK, TV_NEVER, &i, &j))
msg_print("But you are not carrying any spell-books!");
else if (get_item(&item_val, "Use which spell-book?", i, j, 0)) {
result = cast_spell("Cast which spell?", item_val, &choice, &chance);
if (py.flags.stun > 50)
chance += 25;
else if (py.flags.stun > 0)
chance += 15;
if (result < 0)
msg_print("You don't know any spells in that book.");
else if (result > 0) {
m_ptr = &magic_spell[py.misc.pclass - 1][choice];
free_turn_flag = FALSE;
if (randint(100) <= chance) /* changed -CFT */
msg_print("You failed to get the spell off!");
else {
chance = py.misc.lev/
(py.misc.pclass==1 ? 2 : (py.misc.pclass==4 ? 4 : 5))
+ stat_adj(A_INT); /* does missile spell do line? -CFT */
/* Spells. */
switch (choice + 1) {
case 1:
if (get_dir(NULL, &dir))
if (randint(100) < (chance-10))
line_spell(GF_MAGIC_MISSILE, dir, char_row, char_col,
damroll(3 + ((py.misc.lev - 1) / 5), 4) );
else
fire_bolt(GF_MAGIC_MISSILE, dir, char_row, char_col,
damroll(3 + ((py.misc.lev - 1) / 5), 4) );
break;
case 2:
(void)detect_monsters();
break;
case 3:
teleport(10);
break;
case 4:
(void)light_area(char_row, char_col,
damroll(2, (py.misc.lev / 2)), (py.misc.lev / 10) + 1);
break;
case 5: /* treasure detection */
(void)detect_treasure();
break;
case 6:
(void)hp_player(damroll(4, 4));
if (py.flags.cut > 0) {
py.flags.cut -= 15;
if (py.flags.cut < 0)
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 7: /* object detection */
(void)detect_object();
break;
case 8:
(void)detect_sdoor();
(void)detect_trap();
break;
case 9:
if (get_dir(NULL, &dir))
fire_ball(GF_POISON_GAS, dir, char_row, char_col,
10 + (py.misc.lev / 2), 2);
break;
case 10:
if (get_dir(NULL, &dir))
(void)confuse_monster(dir, char_row, char_col, py.misc.lev);
break;
case 11:
if (get_dir(NULL, &dir))
if (randint(100) < (chance-10))
line_spell(GF_LIGHTNING, dir, char_row, char_col,
damroll(3+((py.misc.lev-5)/4),8));
else
fire_bolt(GF_LIGHTNING, dir, char_row, char_col,
damroll(3+((py.misc.lev-5)/4),8));
break;
case 12:
(void)td_destroy();
break;
case 13:
if (get_dir(NULL, &dir))
(void)sleep_monster(dir, char_row, char_col);
break;
case 14:
(void)cure_poison();
break;
case 15:
teleport((int)(py.misc.lev * 5));
break;
case 16:
if (get_dir(NULL, &dir)) {
msg_print("A line of blue shimmering light appears.");
light_line(dir, char_row, char_col);
}
break;
case 17:
if (get_dir(NULL, &dir))
if (randint(100) < (chance-10))
line_spell(GF_FROST, dir, char_row, char_col,
damroll(5+((py.misc.lev-5)/4),8));
else
fire_bolt(GF_FROST, dir, char_row, char_col,
damroll(5+((py.misc.lev-5)/4),8));
break;
case 18:
if (get_dir(NULL, &dir))
(void)wall_to_mud(dir, char_row, char_col);
break;
case 19:
create_food();
break;
case 20:
(void)recharge(5);
break;
case 21:
(void)sleep_monsters1(char_row, char_col);
break;
case 22:
if (get_dir(NULL, &dir))
(void)poly_monster(dir, char_row, char_col);
break;
case 23:
(void)ident_spell();
break;
case 24:
(void)sleep_monsters2();
break;
case 25:
if (get_dir(NULL, &dir))
if (randint(100) < chance)
line_spell(GF_FIRE, dir, char_row, char_col,
damroll(8+((py.misc.lev-5)/4),8));
else
fire_bolt(GF_FIRE, dir, char_row, char_col,
damroll(8+((py.misc.lev-5)/4),8));
break;
case 26:
if (get_dir(NULL, &dir))
(void)speed_monster(dir, char_row, char_col, -1);
break;
case 27:
if (get_dir(NULL, &dir))
fire_ball(GF_FROST, dir, char_row, char_col,
30 + (py.misc.lev), 2);
break;
case 28:
(void)recharge(40);
break;
case 29:
if (get_dir(NULL, &dir))
(void)teleport_monster(dir, char_row, char_col);
break;
case 30:
f_ptr = &py.flags;
if (f_ptr->fast <= 0)
f_ptr->fast += randint(20) + py.misc.lev;
else
f_ptr->fast += randint(5);
break;
case 31:
if (get_dir(NULL, &dir))
fire_ball(GF_FIRE, dir, char_row, char_col
, 55 + (py.misc.lev), 2);
break;
case 32:
destroy_area(char_row, char_col);
break;
case 33:
(void)genocide(TRUE);
break;
case 34: /* door creation */
(void)door_creation();
break;
case 35: /* Stair creation */
(void)stair_creation();
break;
case 36: /* Teleport level */
(void)tele_level();
break;
case 37: /* Earthquake */
earthquake();
break;
case 38: /* Word of Recall */
if (py.flags.word_recall == 0) {
py.flags.word_recall = 15 + randint(20);
msg_print("The air about you becomes charged...");
} else {
py.flags.word_recall = 0;
msg_print("A tension leaves the air around you...");
}
break;
case 39: /* Acid Bolt */
if (get_dir(NULL, &dir))
if (randint(100) < (chance-5))
line_spell(GF_ACID, dir, char_row, char_col,
damroll(6+((py.misc.lev-5)/4), 8));
else
fire_bolt(GF_ACID, dir, char_row, char_col,
damroll(6+((py.misc.lev-5)/4), 8));
break;
case 40: /* Cloud kill */
if (get_dir(NULL, &dir))
fire_ball(GF_POISON_GAS, dir, char_row, char_col,
20 + (py.misc.lev / 2), 3);
break;
case 41: /* Acid Ball */
if (get_dir(NULL, &dir))
fire_ball(GF_ACID, dir, char_row, char_col,
40 + (py.misc.lev), 2);
break;
case 42: /* Ice Storm */
if (get_dir(NULL, &dir))
fire_ball(GF_FROST, dir, char_row, char_col,
70 + (py.misc.lev), 3);
break;
case 43: /* Meteor Swarm */
if (get_dir(NULL, &dir))
fire_ball(GF_METEOR, dir, char_row, char_col,
65 + (py.misc.lev), 3);
break;
case 44: /* Hellfire */
if (get_dir(NULL, &dir))
fire_ball(GF_HOLY_ORB, dir, char_row, char_col, 300, 2);
break;
case 45: /* Detect Evil */
(void)detect_evil();
break;
case 46: /* Detect Enchantment */
(void)detect_magic();
break;
case 47:
recharge(100);
break;
case 48:
(void)genocide(TRUE);
break;
case 49:
(void)mass_genocide(TRUE);
break;
case 50:
py.flags.resist_heat += randint(20) + 20;
break;
case 51:
py.flags.resist_cold += randint(20) + 20;
break;
case 52:
py.flags.resist_acid += randint(20) + 20;
break;
case 53:
py.flags.resist_poison += randint(20) + 20;
break;
case 54:
py.flags.resist_heat += randint(20) + 20;
py.flags.resist_cold += randint(20) + 20;
py.flags.resist_light += randint(20) + 20;
py.flags.resist_poison += randint(20) + 20;
py.flags.resist_acid += randint(20) + 20;
break;
case 55:
py.flags.hero += randint(25) + 25;
break;
case 56:
py.flags.shield += randint(20) + 30;
calc_bonuses();
prt_pac();
calc_mana(A_INT);
msg_print("A mystic shield forms around your body!");
break;
case 57:
py.flags.shero += randint(25) + 25;
break;
case 58:
if (py.flags.fast <= 0)
py.flags.fast += randint(30) + 30 + py.misc.lev;
else
py.flags.fast += randint(5);
break;
case 59:
py.flags.invuln += randint(8) + 8;
break;
default:
break;
}
/* End of spells. */
if (!free_turn_flag) {
p_ptr = &py.misc;
if (choice < 32) {
if ((spell_worked & (1L << choice)) == 0) {
p_ptr->exp += m_ptr->sexp << 2;
spell_worked |= (1L << choice);
prt_experience();
}
} else {
if ((spell_worked2 & (1L << (choice - 32))) == 0) {
p_ptr->exp += m_ptr->sexp << 2;
spell_worked2 |= (1L << (choice - 32));
prt_experience();
}
}
}
}
p_ptr = &py.misc;
if (!free_turn_flag) {
if (m_ptr->smana > p_ptr->cmana) {
msg_print("You faint from the effort!");
py.flags.paralysis =
randint((int)(5 * (m_ptr->smana - p_ptr->cmana)));
p_ptr->cmana = 0;
p_ptr->cmana_frac = 0;
if (randint(3) == 1) {
msg_print("You have damaged your health!");
(void)dec_stat(A_CON);
}
} else
p_ptr->cmana -= m_ptr->smana;
prt_cmana();
}
}
}
}